package com.lizemin.spring.server;

import cn.hutool.core.exceptions.ExceptionUtil;
import com.lizemin.spring.mvc.DispatchServlet;
import com.lizemin.spring.util.YamlConfigLoader;
import lombok.extern.slf4j.Slf4j;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;

import java.util.Objects;

/**
 * @author lzm
 * @date 2025/4/26 16:02
 * @description tomcat服务器启动类
 */
@Slf4j
public class TomcatServer {

    public static final String DEFAULT_SERVLET = "DispatchServlet";

    public void start() {
        // 创建Tomcat实例
        Tomcat tomcat = new Tomcat();

        // 设置端口号（默认8080）
        Integer port = YamlConfigLoader.getConfig("server.port", Integer.class);
        if (Objects.isNull(port)) {
            port = 8080;
        }
        tomcat.setPort(port);

        // 设置应用上下文路径（根路径"/"）
        String contextPath = "/";

        // 设置Web应用的部署目录（这里使用内存中的方式）
        String baseDir = System.getProperty("user.dir");
        // 添加Web应用上下文
        Context context = tomcat.addContext(contextPath, baseDir);

        // 注册dispatchServlet
        Tomcat.addServlet(context, DEFAULT_SERVLET, new DispatchServlet());
        context.addServletMappingDecoded("/*", DEFAULT_SERVLET);

        // 启动Tomcat服务器
        try {
            tomcat.start();
            log.info("Tomcat服务器启动成功，端口号：{}", port);
        } catch (LifecycleException e) {
            System.err.println("Tomcat服务器启动失败: " + ExceptionUtil.stacktraceToString(e));
            throw new RuntimeException(e);
        }

        // 等待服务器停止
        tomcat.getServer().await();
    }
}
